package com.msf.tutorial.java8.chapter7;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 练习
 *
 * 1、给定一个数字列表，如何返回一个由每个数的平方构成的列表呢？例如，给定[1, 2, 3, 4, 5]，应该返回[1, 4, 9, 16, 25]
 * 2、给定两个数字列表，如何返回所有的数对呢？例如，给定列表[1, 2, 3]和列表[3, 4]，应该返回[(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]
 * 3、对 2 进行扩展，只返回总和能被3整除的数对呢？例如(2, 4)和(3, 3)是可以的
 */
public class C03Exam {

    /**
     * 1、给定一个数字列表，如何返回一个由每个数的平方构成的列表呢？例如，给定[1, 2, 3, 4, 5]，应该返回[1, 4, 9, 16, 25]
     */
    public static List<Integer> exercises_1() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        return list.stream()
            .map(i -> i * i)
            .collect(Collectors.toList());
    }

    /**
     * 2、给定两个数字列表，如何返回所有的数对呢？例如，给定列表[1, 2, 3]和列表[3, 4]，应该返回[(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]
     */
    public static List<int[]> exercises_2() {
        List<Integer> listA = Arrays.asList(1, 2, 3);
        List<Integer> listB = Arrays.asList(3, 4);
        return listA.stream()
                    .flatMap(a -> listB.stream()
                                       .map(b -> new int[] {a, b}))
                    .collect(Collectors.toList());
    }

    /**
     * 3、对 2 进行扩展，只返回总和能被3整除的数对呢？例如(2, 4)和(3, 3)是可以的
     */
    public static List<int[]> exercises_3() {
        List<Integer> listA = Arrays.asList(1, 2, 3);
        List<Integer> listB = Arrays.asList(3, 4);
        return listA.stream()
                    .flatMap(a -> listB.stream()
                                       .filter(b -> (a + b) % 3 == 0)
                                       .map(b -> new int[] {a, b}))
                    .collect(Collectors.toList());
    }

}
